#ifndef FUNCIONESEXT2
#define FUNCIONESEXT2 1

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <string.h>
#include "variablesGlobales.c"
#include "funcionesConversion.c"

void * abreDiscoEnMemoria(char *);
void leerSuperBloque(void);
void leerGroupDescriptor(unsigned int);
void leerTablaInodos(unsigned int);

//mappea el disco en memoria
void * abreDiscoEnMemoria (char * rutaArchivo){

    int descriptorDisco;
    void * map;
    struct stat statbuf;

    descriptorDisco = open(rutaArchivo, O_RDWR);
    fstat(descriptorDisco, &statbuf);

    tamanoDisco = statbuf.st_size;

    map = mmap(0, statbuf.st_size, PROT_READ | PROT_WRITE, MAP_SHARED, descriptorDisco, 0);

    posix_madvise(map, statbuf.st_size, POSIX_MADV_RANDOM);

    return map;
}//fin mappear disco

//leer superbloque y lo guarda en una estructura

void leerSuperBloque(void){
    char sb[1024];
    memcpy(sb, Disco + 1024, 1024);

    superBlock.cantidadInodos  = convertir_desde_binario(sb + 0, 4);
    superBlock.cantidadBloques = convertir_desde_binario(sb + 4, 4);
    superBlock.bloquesLibres   = convertir_desde_binario(sb + 12, 4);
    superBlock.inodosLibres    = convertir_desde_binario(sb + 16, 4);
    superBlock.bloquesPorGrupo = convertir_desde_binario(sb + 32, 4);
    superBlock.inodosPorGrupo  = convertir_desde_binario(sb + 40, 4);
    superBlock.tamanoInodo     = convertir_desde_binario(sb + 88, 2);
    superBlock.tamanoBloque    = convertir_desde_binario(sb + 24, 4);
}
//fin leer superbloque

//leer Block Group Descriptor Table 

void leerGroupDescriptor(unsigned int offsetDescGroup){
     char descGroup[superBlock.tamanoBloque];
     memcpy(descGroup, Disco + offsetDescGroup, 32);

     groupDescriptor.blockBitmap           = convertir_desde_binario(descGroup + 0, 4);
     groupDescriptor.inodeBitmap           = convertir_desde_binario(descGroup + 4, 4);
     groupDescriptor.startInodeTable       = convertir_desde_binario(descGroup + 8, 4);
     groupDescriptor.cantUnallocatedBlocks = convertir_desde_binario(descGroup + 12, 2);
     groupDescriptor.cantUnallocatedInodes = convertir_desde_binario(descGroup + 14, 2);
     groupDescriptor.cantDirectories       = convertir_desde_binario(descGroup + 16, 2); 
}
//fin leer Block Group Descriptor Table

//leer Tabla de Inodos
void leerTablaInodos(unsigned int offsetInode){
    char descInode[superBlock.tamanoInodo];
    memcpy(descInode, Disco + offsetInode, 128);

        inodo.mode        = convertir_desde_binario(descInode + 0, 2);
        inodo.uid         = convertir_desde_binario(descInode + 2, 2);
        inodo.size        = convertir_desde_binario(descInode + 4, 4);
        inodo.gid         = convertir_desde_binario(descInode + 24, 2);
        inodo.links_count = convertir_desde_binario(descInode + 26, 2);
        inodo.blocks      = convertir_desde_binario(descInode + 28, 4);
        inodo.flags       = convertir_desde_binario(descInode + 32, 4);
        inodo.block       = convertir_desde_binario(descInode + 40, 60);
        inodo.generation  = convertir_desde_binario(descInode + 100, 4);
        inodo.file_acl    = convertir_desde_binario(descInode + 104, 4);
        inodo.dir_acl     = convertir_desde_binario(descInode + 108, 4);
        inodo.faddr       = convertir_desde_binario(descInode + 112, 4);
        inodo.osd2        = convertir_desde_binario(descInode + 116, 12);
}
// fin leer Tabla de Inodos
#endif

